﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace CommonClasses.Dialogs
{
    //диалог позволяет задать параметры нового проекта
    //проверка путей на корректность вызывается только при нажатии на OKButton (а не при потере полем ввода фокуса)
    //механизм проверки на основе сообщения - http://www.rsdn.ru/Forum/?mid=2763832
    public partial class NewProjectDialog : Form
    {
        public string PrjFolderPath;
        public string PrjFileName;
        public string DomainModelFileFullPath;

        private string defPrjDir;
        //известные приложению файлы с описанием оборудования
        private List<string> knownDomModels = new List<string>();

        /// <param name="defPrjDir">Путь по умолчанию к папке с проектами</param>
        /// <param name="defDomModDir">Путь по умолчанию к папке с описаниями оборудования</param>
        public NewProjectDialog(string defPrjDir,string defDomModDir)
        {
            InitializeComponent();
            if(Directory.Exists(defPrjDir))
                this.defPrjDir = defPrjDir;
            if (Directory.Exists(defDomModDir))
                knownDomModels = new List<string>(Directory.GetFiles(defDomModDir,"*.ihdm"));

            DirPrjTextBox.Text = this.defPrjDir;
            foreach (var models in knownDomModels)
                DomainModelCtrlBox.Items.Add(models);
            DomainModelCtrlBox.SelectedIndex = 0;

            DirPrjTextBox_Validated(null, null);
            NamePrjTextBox_Validated(null, null); 


            NamePrjTextBox.Select();
        }

        private void BrowseButton_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog fbd = new FolderBrowserDialog();
            fbd.Description = "Выберите директорию в которой будет создан файл проекта. При этом все файлы проекта будут также сохраняться в этой директории";
            fbd.ShowNewFolderButton = true;
            fbd.SelectedPath = PrjFolderPath;
            fbd.ShowNewFolderButton = true;

            DialogResult r = fbd.ShowDialog();

            //диалоги могут менять CurrentDirectory
            Environment.CurrentDirectory = System.Windows.Forms.Application.StartupPath;

            if (r == DialogResult.OK)
            {
                DirPrjTextBox.Text = fbd.SelectedPath;
                //поскольку мы меняем содержимое DirPrjTextBox из кода, 
                //то должны послать сообщение Validating - эмулируем смену фокуса
                DirPrjTextBox.Focus();
                BrowseButton.Focus();
            }
        }
                    

        private void DirPrjTextBox_Validating(object sender, CancelEventArgs e)
        {
            //if (DialogResult == AcceptButton.DialogResult)
            {
                string path = DirPrjTextBox.Text.Trim();
                int indx = path.IndexOfAny(Path.GetInvalidPathChars());
                if (indx > 0)
                {
                    errorProvider1.SetError(DirPrjTextBox, "Имя директории не может содержать символ: " + path[indx]);
                    e.Cancel = true;
                }
                if (path == "")
                {
                    errorProvider1.SetError(DirPrjTextBox, "Имя директории должно быть задано");
                    e.Cancel = true;
                }
            }
        }

        private void DirPrjTextBox_Validated(object sender, EventArgs e)
        {
            //if (DialogResult == AcceptButton.DialogResult)
            {
              if (!Path.IsPathRooted(DirPrjTextBox.Text.Trim()))
                PrjFolderPath = Application.StartupPath + (DirPrjTextBox.Text.Trim().StartsWith(".") ? DirPrjTextBox.Text.Trim().Remove(0, 1) : PrjFolderPath); 
              else PrjFolderPath = DirPrjTextBox.Text.Trim();
                errorProvider1.SetError(DirPrjTextBox, null);
            }
        }

        private void NamePrjTextBox_Validating(object sender, CancelEventArgs e)
        {
            //if (DialogResult == AcceptButton.DialogResult)
            {
                string name = NamePrjTextBox.Text.Trim();
                int indx = name.IndexOfAny(Path.GetInvalidFileNameChars());
                if (indx > 0)
                {
                    errorProvider1.SetError(NamePrjTextBox, "Имя файла не может содержать символ: " + name[indx]);
                    e.Cancel = true;
                }
                if (name == "")
                {
                    errorProvider1.SetError(NamePrjTextBox, "Имя файла должно быть задано");
                    e.Cancel = true;
                }
            }
        }

        private void NamePrjTextBox_Validated(object sender, EventArgs e)
        {
            //if (DialogResult == AcceptButton.DialogResult)
            {

                string name = NamePrjTextBox.Text.Trim();
                if (!name.EndsWith(".ihprj"))
                {
                    name = name.Insert(name.Length, ".ihprj");
                }
                PrjFileName = name;
                errorProvider1.SetError(NamePrjTextBox, "");
            }
        }

        private void BrowseButton2_Click(object sender, EventArgs e)
        {
            OpenFileDialog dial = new OpenFileDialog();

            dial.AddExtension = true;
            dial.CheckFileExists = true;
            dial.Multiselect = false;
            dial.SupportMultiDottedExtensions = false;
            dial.DefaultExt = "Описание оборудования (*.ihdm) | *.ihdm";
            dial.Filter = "Описание оборудования (*.ihdm) | *.ihdm";
            DialogResult res = dial.ShowDialog();


            //диалоги могут менять CurrentDirectory
            Environment.CurrentDirectory = System.Windows.Forms.Application.StartupPath;

            if (res == DialogResult.OK)
            {
                DomainModelFileFullPath = dial.FileName;
                DomainModelCtrlBox.Text = DomainModelFileFullPath;
                //поскольку мы меняем содержимое DomainModelCtrlBox из кода, 
                //то должны послать сообщение Validating - эмулируем смену фокуса
                DomainModelCtrlBox.Focus();
                BrowseButton2.Focus();
            }

        }

        private void DomainModelCtrlBox_Validating(object sender, CancelEventArgs e)
        {
            //if (DialogResult == AcceptButton.DialogResult)
            {
                string modelpath = DomainModelCtrlBox.Text.Trim();

                if (!File.Exists(modelpath))
                {
                    errorProvider1.SetError(DomainModelCtrlBox, "Данный файл не существует");
                    e.Cancel = true;
                }
                if (modelpath == "")
                {
                    errorProvider1.SetError(DomainModelCtrlBox, "Имя файла должно быть задано");
                    e.Cancel = true;
                }
            }
        }

        private void DomainModelCtrlBox_Validated(object sender, EventArgs e)
        {
            //if (DialogResult == AcceptButton.DialogResult)
            {
                DomainModelFileFullPath = DomainModelCtrlBox.Text.Trim();
                errorProvider1.SetError(DomainModelCtrlBox, "");
            }
        }

        private void OKButton_Click(object sender, EventArgs e)
        {
          DirPrjTextBox_Validated(null, null);
          NamePrjTextBox_Validated(null, null);
          if (File.Exists(this.PrjFolderPath + "\\" + this.PrjFileName))
          {
            DialogResult res = MessageBox.Show("Файл проекта" + this.PrjFolderPath + "\\" + this.PrjFileName
                                   + " уже существует. Переписать его?", "Подтверждение", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
            if (res == DialogResult.Cancel)
              DialogResult = DialogResult.None;
          }

          if (!ValidateChildren())
            DialogResult = DialogResult.None; // Валидация прошла неуспешно, отменяем закрытие формы
        }

        private void NamePrjTextBox_TextChanged(object sender, EventArgs e)
        {
          DirPrjTextBox.Text = this.defPrjDir + "\\" + NamePrjTextBox.Text;
        }
        
    }

}
